/**
 * 装饰器
 *  react @connect
 *  nest.js da大量会用到装饰器
 *  类装饰器  装饰类的，用在类声明之前，用来监视修改和替换类的含义
 *
 *  静态属性是属于类的，非静态属性是属于实例的
 *
 *  装饰器的执行顺序
 *  1.有多个装饰器的时候，从最后一个参数依次向前执行
 *  2.类装饰器总是最后执行
 *
 *
 * */
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var a;
(function (a) {
    /**
     * 类装饰器
     * */
    function classDecorator() {
        return function (target) {
            console.log('class decorator');
        };
    }
    /**
     * 属性装饰器有两个参数：
     * @param：target ：如果是静态成员，target就是类的构造函数，
     * @param：property：方法或者属性的名称
     *
     * */
    function upperCase(target, property) {
        var value = target[property];
        var getter = function () { return value; };
        var setter = function (newVal) {
            value = newVal.toUpperCase();
        };
        if (delete target[property]) {
            Object.defineProperty(target, property, {
                get: getter,
                set: setter,
                enumerable: true,
                configurable: true
            });
        }
    }
    /**
     * 方法装饰器  三个参数
     * @param：target ：如果是静态成员，target就是类的构造函数，如果是实例成员，
     * @param：property：方法的名称
     * @parram：escriptor 方法的描述器
     *
     * */
    function noEnumable(target, property, descriptor) {
        function noEnumable(target, property, descriptor) {
            descriptor.enumerable = false;
        }
    }
    var Person = /** @class */ (function () {
        function Person() {
            this.name = 'ygg';
        }
        Person.prototype.getName = function () {
            console.log(this.name);
        };
        __decorate([
            upperCase
        ], Person.prototype, "name");
        __decorate([
            noEnumable
        ], Person.prototype, "getName");
        Person = __decorate([
            classDecorator()
        ], Person);
        return Person;
    }());
    var p = new Person();
    p.name = 'zhufeng';
    console.log('p.name', p.name);
})(a || (a = {}));
